/**
 * 存储购物车数据
 */
import {
  mergeLocalCart,
  findCartList,
  insertCart,
  deleteCart,
  updateCart,
  checkAllCart
} from '@/api/cart'
export default {
  namespaced: true,
  state: () => ({
    // 购物车列表
    list: []
  }),
  mutations: {
    // 加入购物车
    /**
     *
     * @param {*} state
     * @param {*} good 当前添加的商品
     */
    addCart (state, good) {
      /**
       * 加入购物车 => 直接push?
       * 判断当前规格(SKU) 的商品之前是否有添加过 => 1- 添加过 => 加数量 2- 没添加过=>新增
       */
      // isHaveIndex 返回存在商品在list的位置 => isHaveIndex > -1
      const isHaveIndex = state.list.findIndex(
        item => item.skuId === good.skuId
      )
      if (isHaveIndex > -1) {
        // 加数量
        state.list[isHaveIndex].count += good.count
      } else {
        state.list.unshift(good)
      }
    },
    // 删除购物车商品
    delCart (state, good) {
      /**
       * 1- 找到被删除商品的索引
       * 2- 调用splice删除一个
       */
      const isHaveIndex = state.list.findIndex(
        item => item.skuId === good.skuId
      )
      state.list.splice(isHaveIndex, 1)
    },

    // 商品的单选
    singleCheck (state, { isCheck, good }) {
      /**
       * 1- 获取需要修改的商品
       * 2- 使用这个商品修改选中状态
       */
      const currGood = state.list.find(item => item.skuId === good.skuId)
      currGood.selected = isCheck
    },

    // 所有商品的选中状态
    selAllGoods (state, selected) {
      // 根据全选框的选中状态selected => 修改list所有商品的选中和未选中
      state.list.forEach(good => {
        good.selected = selected
      })
    },

    // 商品修改数量
    changeCount (state, { newCount, good }) {
      /**
       * 1- 获取要修改的商品
       * 2- 使用这个商品修改最新数量
       */
      const currGood = state.list.find(item => item.skuId === good.skuId)
      currGood.count = newCount
    },

    // 存储最新后台返回的购物车列表数据
    setCartList (state, list) {
      state.list = list
    }
  },
  actions: {
    /**
     * 加入购物车的action方法
     * @param {*} rootState 获取store的根 => 通过根可以获取其他模块的数据
     * @param {*} good 当前加入购物车的商品
     * @returns
     */
    // async 异步函数 => 语法题 => 返回Promise对象 => 通过return对外返回值(等价于reslove)
    // 购物车添加
    async addCartAction ({ commit, dispatch, rootState }, good) {
      if (rootState.user.profile.token) {
        // return '已登录'
        // 1- 把当前加入购物车的商品存到数据库
        await insertCart(good)
        // 2- 从数据库获取最新的购物车列表数据
        dispatch('getLoginCartAction')
      } else {
        commit('addCart', good)
        // return '未登录'
      }
    },

    // 购物车删除
    async delCartAction ({ commit, dispatch, rootState }, good) {
      if (rootState.user.profile.token) {
        // return '已登录'
        await deleteCart([good.skuId])
        dispatch('getLoginCartAction')
      } else {
        commit('delCart', good)
        // return '未登录'
      }
    },

    // 购物车修改单选
    async singleCheckAction ({ commit, dispatch, rootState }, good) {
      if (rootState.user.profile.token) {
        // return '已登录'
        await updateCart({ ...good.good, selected: good.isCheck })
        dispatch('getLoginCartAction')
      } else {
        commit('singleCheck', good)
        // return '未登录'
      }
    },

    // 购物车修改全选
    async selAllGoodsAction ({ commit, getters, dispatch, rootState }, selected) {
      if (rootState.user.profile.token) {
        // return '已登录'
        const ids = getters.validList.map(good => good.skuId)
        await checkAllCart({ selected, ids })
        dispatch('getLoginCartAction')
      } else {
        commit('selAllGoods', selected)
        // return '未登录'
      }
    },

    // 购物车修改数量
    async changeCountAction ({ commit, dispatch, rootState }, good) {
      if (rootState.user.profile.token) {
        // return '已登录'
        await updateCart({ ...good.good, count: good.newCount })
        dispatch('getLoginCartAction')
      } else {
        commit('changeCount', good)
        // return '未登录'
      }
    },

    // 获取当前登录人最新购物车列表数据
    async getLoginCartAction ({ commit }) {
      const { result } = await findCartList()
      commit('setCartList', result)
    },

    // 合并之前本地存储的购物车数据到当前登录人名下
    async mergeCartAction ({ state, dispatch }) {
      // 1- 处理后台合并需要的购物车列表数据 => [{skuId, selected, count}]
      if (state.list.length) {
        const newCartList = state.list.map(({ skuId, selected, count }) => {
          return { skuId, selected, count }
        })
        await mergeLocalCart(newCartList)
        // 2- 合并之后的效果 => 当前登录人就拥有了之前本地存储的购物车数据
      }
      // 3. 获取当前登录人最新的购物车列表数据=》查接口
      dispatch('getLoginCartAction')
    }
  },
  getters: {
    // 购物车有效商品列表
    validList: state => {
      return state.list.filter(good => good.isEffective)
    },
    // 有效的总数量
    totalCounts (state, getters) {
      return getters.validList.reduce((acc, good) => acc + good.count, 0)
    },
    // 有效总价
    totalPrice (state, getters) {
      return getters.validList.reduce(
        (acc, good) => acc + good.count * good.nowPrice,
        0
      )
    },
    // 选中的列表
    selectList (state, getters) {
      return getters.validList.filter(good => good.selected)
    },
    // 选中的列表总价
    selectListTotalPrice (state, getters) {
      return getters.selectList.reduce(
        (acc, good) => acc + good.count * good.nowPrice,
        0
      )
    },
    // 是否全部选中
    // validList = [] => every执行判断后=> true => 通过判断有无数据解决
    isAll (state, getters) {
      if (getters.validList.length) {
        return getters.validList.every(good => good.selected)
      }
      return false
    }
  }
}
